import numpy as np


def copyFun():
    """
    todo 暂时体现任何体现，但是总体来看，应该是浅复制和深复制的关系
    :return:
    """
    data = [1, 2, 3]
    arr1_source = np.array(data, copy=True)
    arr1_copy = np.copy(arr1_source)
    arr1_eq = arr1_source
    arr1_copy[0] = 11

    arr2_source = np.array(data, copy=False)
    arr2_copy = np.copy(arr2_source)
    arr2_eq = arr2_source
    arr2_copy[0] = 22

    print(arr1_source)
    print(arr1_copy)
    print(arr1_eq)

    # print(arr1_source[0] == arr1_copy[0])
    # print(arr1_source[0] == arr1_eq[0])

    print(arr1_source is arr1_copy)
    print(arr1_source is arr1_eq)

    print(arr2_source)
    print(arr2_copy)
    print(arr2_eq)
    print(arr2_source is arr2_copy)
    print(arr2_source is arr2_eq)


def ndminFun():
    """
    ndmin 用于指定数组的最小维度
    默认情况下ndmin=0，表示维度根据数据的维度变化而变化
    指定ndmin（维度数）小于原数组的维度采用原数组的维度，反之对原数据进行升维
    :return:
    """

    arr_source = np.zeros((2, 2))

    # 维度形状
    arr_source_shape = arr_source.shape
    # 维度数
    arr_source_ndim = arr_source.ndim

    # 指定ndmin（维度数）小于原数组的维度采用原数组的维度
    arr_reduction_dmin = np.array(arr_source, ndmin=1)
    # 维度形状
    arr_reduction_shape = arr_reduction_dmin.shape
    # 维度数
    arr_reduction_ndim = arr_reduction_dmin.ndim

    # 指定ndmin（维度数）大于原数组的维度采用原数组的维度
    arr_increase_dmin = np.array(arr_source, ndmin=3)
    # 维度形状
    arr_increase_shape = arr_increase_dmin.shape
    # 维度数
    arr_increase_ndim = arr_increase_dmin.ndim

    print(arr_source)
    print(arr_source_shape)
    print(arr_source_ndim)

    print(arr_reduction_dmin)
    print(arr_reduction_shape)
    print(arr_reduction_ndim)

    print(arr_increase_dmin)
    print(arr_increase_shape)
    print(arr_increase_ndim)


def frombufferFun():
    """
    将data以流的形式读入转化成ndarray对象

    buffer:缓冲区，它表示暴露缓冲区接口的对象。
    dtype：代表返回的数据类型数组的数据类型。默认值为0。
    offset：偏移量，起始位置。默认值为0。
    :return:
    """
    buff_data = b'123456789'

    buff_arr_1 = np.frombuffer(buffer=b'123', dtype="S3", offset=3)
    buff_arr_2 = np.frombuffer(buffer=b'123', dtype="S3", offset=3)
    buff_arr_3 = np.frombuffer(b'123', dtype="S3")

    print(buff_arr_1)
    print(buff_arr_2)
    print(buff_arr_3)


def fromiterFun():
    """
    从迭代对象（函数）创建一个新的一维数组
    iter ：iterable 提供数组数据的可迭代对象。
    dtype ：data-type

    :return:
    """
    iterable = (x ** 2 for x in range(5))
    iter_arr = np.fromiter(iter=iterable, dtype=float)

    print(iter_arr)


def initNdarry():
    """
    根据原始数组的维度，使用**_like函数按照原数组维度进行数据初始化
    :return:
    """
    source = [[1, 2], [3, 4]]

    # 初始化数据，并以随机数填充
    empty_arr = np.empty_like(source)
    # 初始化数据，并以0数填充
    zeros_arr = np.zeros_like(source)
    # 初始化数据，并以1数填充
    ones_arr = np.ones_like(source)
    # 初始化数据，并以3数填充，（默认类型为int）
    full_arr_1 = np.full_like(source, 3.14)
    # 初始化数据，并以3数填充，（指定类型为int）
    full_arr_2 = np.full_like(source, 3.14, int)
    # 初始化数据，并以3.14数填充，（指定类型为float）
    full_arr_3 = np.full_like(source, 3.14, float)

    print(empty_arr)
    print(zeros_arr)
    print(ones_arr)
    print(full_arr_1)
    print(full_arr_2)
    print(full_arr_3)


def reshapeFun():
    """
    数组重塑、转置
    :return:
    """
    data = [1, 2, 3, 4, 5, 6]

    share23 = np.array(data).reshape(2, 3)

    share32 = share23.reshape(3, 2)

    share23T = share32.T

    print(share23)
    print(share32)
    print(share23T)


def showNpInfo():
    """
    显示数据类型
    :return:
    """
    arr = np.array([1, 2, 3], dtype=float)

    dtype = arr.dtype

    clazz = type(arr)

    print(dtype)
    print(clazz)



if __name__ == '__main__':
    # showNpInfo()
    # ndminFun()
    # todo copyFun()
    # fromiterFun()
    # initNdarry()
    reshapeFun()
